package negocio;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name="LVTP_FACTURAS_CLIENTES")
public class FacturaCliente
{
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column (name="ID_FACTURA_CLIENTE")
	private Integer codigo;
	@Column (name="NUMERO", nullable=false, length=50)
	private String numero;
	@Column (name="FECHA", nullable=false)
	private Date fecha;
	@Column (name="DESCUENTO")
	private float descuento;
	@OneToOne
	@JoinColumn(name="ID_CONDICION_PAGO")
	private CondicionDePago condicionDePago;
	@OneToOne
	@JoinColumn(name="ID_CLIENTE")
	private Cliente cliente;
	@OneToOne
	@JoinColumn(name="ID_PEDIDO")
	private OrdenDePedidoCliente ordenDePedido;
	
	@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
	@LazyCollection(LazyCollectionOption.FALSE)
	@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@JoinColumn(name="ID_FACTURA_CLIENTE")
	private Set<FacturaClienteItem> items;
	
	public FacturaCliente()
	{
		this.items = new HashSet<FacturaClienteItem>();	
	}
	
	public Integer getCodigo() {
		return codigo;
	}
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public Date getFecha() {
		return fecha;
	}
	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	public float getDescuento() {
		return descuento;
	}
	public void setDescuento(float descuento) {
		this.descuento = descuento;
	}
	public CondicionDePago getCondicionDePago() {
		return condicionDePago;
	}
	public void setCondicionDePago(CondicionDePago condicionDePago) {
		this.condicionDePago = condicionDePago;
	}
	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	public OrdenDePedidoCliente getOrdenDePedido() {
		return ordenDePedido;
	}
	public void setOrdenDePedido(OrdenDePedidoCliente ordenDePedido) {
		this.ordenDePedido = ordenDePedido;
	}

	public Set<FacturaClienteItem> getItems() {
		return items;
	}

	public void setItems(Set<FacturaClienteItem> items) {
		this.items = items;
	}
	
	public Double calcularTotal(){
		Double r = new Double(0);
		for(FacturaClienteItem item : items){
			r+=item.getPrecio();
		}
		return r - (r * descuento/100);
	}
	
	public boolean equals(Object obj)
	{
		if (obj != null && this.getClass().isInstance(obj)){
			FacturaCliente tmp = (FacturaCliente)obj;
			return codigo.equals(tmp.getCodigo());
		}
		return false;
	}
}
